package com.malou.client.ventas.direccioncliente;

import java.util.ArrayList;
import java.util.List;

import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.binding.FieldBinding;
import com.extjs.gxt.ui.client.binding.FormBinding;
import com.extjs.gxt.ui.client.data.BeanModel;
import com.extjs.gxt.ui.client.event.BaseEvent;
import com.extjs.gxt.ui.client.event.ButtonEvent;
import com.extjs.gxt.ui.client.event.Events;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.SelectionChangedEvent;
import com.extjs.gxt.ui.client.event.SelectionChangedListener;
import com.extjs.gxt.ui.client.event.SelectionListener;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.store.StoreEvent;
import com.extjs.gxt.ui.client.store.StoreListener;
import com.extjs.gxt.ui.client.widget.Component;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.Dialog;
import com.extjs.gxt.ui.client.widget.Status;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.ComboBox.TriggerAction;
import com.extjs.gxt.ui.client.widget.form.FormPanel;
import com.extjs.gxt.ui.client.widget.form.HiddenField;
import com.extjs.gxt.ui.client.widget.form.TextArea;
import com.extjs.gxt.ui.client.widget.form.TextField;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.layout.FormData;
import com.extjs.gxt.ui.client.widget.toolbar.FillToolItem;
import com.google.gwt.core.client.GWT;
import com.malou.client.MalouConstants;
import com.malou.client.util.Utilities;
import com.malou.client.ventas.ubigeo.Pais;
import com.malou.client.ventas.ubigeo.Ubigeos;

public class DireccionClienteDialog extends Dialog {

	protected HiddenField<String> id;
	protected TextField<String> ciudad;
	protected TextField<String> direccion;
	private TextArea referencias;
	public ComboBox<Pais> paises;
	public ComboBox<BeanModel> departamento;
	public ComboBox<BeanModel> provincia;
	public ComboBox<BeanModel> distrito;

	protected Button guardar;
	protected Button cancelar;
	protected Status status;
	private FormBinding formBindings;
	private DireccionCliente cl;
	private MalouConstants constants = GWT.create(MalouConstants.class);
	private ListStore<Pais> store;

	public DireccionClienteDialog() {
		super();
		setLayout(new FitLayout());
		setModal(true);
		setPlain(true);
		setSize(450, 320);
		setClosable(true);

		store = new ListStore<Pais>();
		Ubigeos.direccionclientedialog = this;
		Ubigeos.getComboPaisCliente();

		FormPanel panel = new FormPanel();
		panel.setBorders(false);
		panel.setBodyBorder(false);
		panel.setPadding(5);
		panel.setHeaderVisible(false);
		panel.setLabelWidth(110);

		formBindings = new FormBinding(panel, false);
		addFields(panel);

		setButtonAlign(HorizontalAlignment.LEFT);
		setButtons("");
		add(panel);

		setBodyBorder(true);
		setResizable(false);
		setFocusWidget(departamento);
		
		provincia.setEnabled(false);
		departamento.setEnabled(false);
		distrito.setEnabled(false);

		Component comp[] = { paises, departamento, provincia, distrito, ciudad,
				direccion, referencias, guardar };
		Utilities.Enter(comp);
       
	}

	@Override
	protected void createButtons() {
		super.createButtons();

		if (constants == null) {
			constants = GWT.create(MalouConstants.class);
		}

		status = new Status();
		status.setBusy(constants.guardando());
		status.hide();
		status.setAutoWidth(true);
		getButtonBar().add(status);

		getButtonBar().add(new FillToolItem());

		cancelar = new Button(constants.cancelar());

		cancelar.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				DireccionClienteDialog.this.hide();
			}

		});

		guardar = new Button(constants.guardar());

		guardar.addSelectionListener(new SelectionListener<ButtonEvent>() {
			public void componentSelected(ButtonEvent ce) {
				if (validate()) {
					status.show();
					getButtonBar().disable();

					cl = new DireccionCliente();

					if (id.getValue() != null)
						cl.setId(Integer.valueOf(id.getValue()));

					cl.setCiudad(ciudad.getValue());
					cl.setDireccion(direccion.getValue());
					cl.setReferencias(referencias.getValue());

					if (paises.getValue() != null)
						cl.setPais_id((Integer) paises.getValue().get("id"));
					if (distrito.getValue() != null)
						cl.setUbigeo_id((Integer) distrito.getValue().get("id"));

					DireccionClientes.direccionclienteDialog = DireccionClienteDialog.this;
					DireccionClientes.save(cl);
				}

			}
		});

		addButton(guardar);
		addButton(cancelar);

	}

	protected boolean validate() {
		boolean pai = paises.isValid();
		boolean dep = departamento.isValid();
		boolean prov = provincia.isValid();
		boolean dis = distrito.isValid();
		boolean dir = direccion.isValid();
		boolean ciu = ciudad.isValid();

		return pai && dep && prov && dis && dir && ciu;
	}

	public void reset() {
		setIconStyle("icon-new");
		setHeading(constants.direccionNuevaDireccion());

		id.clear();
		direccion.clear();
		ciudad.clear();
		referencias.clear();
		departamento.clearSelections();
		provincia.clearSelections();
		distrito.clearSelections();
		
		provincia.setEnabled(false);
		departamento.setEnabled(false);
		distrito.setEnabled(false);

		paises.setValue(paises.getStore().getAt(175));

		status.hide();
		getButtonBar().enable();
	}

	public void setStore(ListStore<BeanModel> store) {

		formBindings.addFieldBinding(new FieldBinding(id, "id"));
		formBindings.addFieldBinding(new FieldBinding(ciudad, "ciudad"));
		formBindings.addFieldBinding(new FieldBinding(direccion, "direccion"));
		formBindings.addFieldBinding(new FieldBinding(referencias,
				"referencias"));
		formBindings.setStore(store);
	}

	private void addFields(ContentPanel cp) {

		id = new HiddenField<String>();
		id.setVisible(false);
		cp.add(id);

		paises = new ComboBox<Pais>();
		paises.setEmptyText("Seleccione pais...");
		paises.setFieldLabel(constants.direccionPais());
		paises.setDisplayField("pais");
		paises.setStore(store);
		paises.setTypeAhead(true);
		paises.setTriggerAction(TriggerAction.ALL);
		paises.addSelectionChangedListener(new SelectionChangedListener<Pais>() {
			@Override
			public void selectionChanged(SelectionChangedEvent<Pais> se) {
				if (se.getSelectedItem() != null) {
					String codigo = se.getSelectedItem().get("codigo");
					if (codigo.trim().equals("PE"))
						departamento.setEnabled(true);
					
					if(!codigo.trim().equals("PE")){
						
						departamento.clearSelections();
						provincia.clearSelections();
						distrito.clearSelections();
						
						departamento.setEnabled(false);
						provincia.setEnabled(false);
						distrito.setEnabled(false);
						
						}
				}
			}
		});

		paises.getStore().addStoreListener(new StoreListener<Pais>() {
			@Override
			public void storeDataChanged(StoreEvent<Pais> se) {
				super.storeDataChanged(se);
				List<Pais> list = new ArrayList<Pais>();
				list.add(paises.getStore().getAt(175));
				paises.setSelection(list);

			}
		});

		cp.add(paises, new FormData("-20"));

		Ubigeos.getComboDepartamento();

		departamento = new ComboBox<BeanModel>();
		departamento.setFieldLabel(constants.direccionDepartamento());
		departamento.setDisplayField("departamento");
		departamento.setEmptyText("Seleccione...");
		departamento.setStore(Ubigeos.storedepartamento);
		departamento.setTriggerAction(TriggerAction.ALL);
		departamento.setValueField("departamento");
		departamento.setUseQueryCache(false);
		departamento.setMinChars(0);
		departamento.getStore().addStoreListener(
				new StoreListener<BeanModel>() {
					public void storeDataChanged(StoreEvent<BeanModel> se) {
						departamento.getStore().filter("departamento",
								departamento.getRawValue());
					}
				});
		departamento
				.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {
					@Override
					public void selectionChanged(
							SelectionChangedEvent<BeanModel> se) {
						if (se.getSelectedItem() != null) {
							String dep = se.getSelectedItem().get(
									"departamento");
							Ubigeos.departamento = dep;
							provincia.clearSelections();
							distrito.clearSelections();
							provincia.setEnabled(true);
							distrito.setEnabled(false);
							
						}
					}
				});
		departamento.addListener(Events.Expand, new Listener<BaseEvent>() {
			@Override
			public void handleEvent(BaseEvent be) {
				departamento.clearSelections();
			}

		});

		cp.add(departamento, new FormData("-20"));

		Ubigeos.getComboProvincia();
		provincia = new ComboBox<BeanModel>();
		provincia.setFieldLabel(constants.direccionProvincia());
		provincia.setDisplayField("provincia");
		provincia.setEmptyText("Seleccione...");
		provincia.setStore(Ubigeos.storeprovincia);
		provincia.setTypeAhead(true);
		provincia.setTriggerAction(TriggerAction.ALL);
		provincia.setValueField("provincia");
		provincia.setUseQueryCache(false);
		provincia.setMinChars(0);
		provincia.getStore().addStoreListener(new StoreListener<BeanModel>() {
			public void storeDataChanged(StoreEvent<BeanModel> se) {
				provincia.getStore().filter("provincia",
						provincia.getRawValue());
			}
		});
		provincia
				.addSelectionChangedListener(new SelectionChangedListener<BeanModel>() {
					@Override
					public void selectionChanged(
							SelectionChangedEvent<BeanModel> se) {
						if (se.getSelectedItem() != null) {
							String pro = se.getSelectedItem().get("provincia");
							Ubigeos.provincia = pro;
							distrito.clearSelections();
							distrito.setEnabled(true); 
							
						}

					}
				});

		provincia.addListener(Events.Expand, new Listener<BaseEvent>() {
			@Override
			public void handleEvent(BaseEvent be) {
				provincia.clearSelections();
			}

		});
		cp.add(provincia, new FormData("-20"));

		Ubigeos.getComboDistrito();

		distrito = new ComboBox<BeanModel>();
		distrito.setFieldLabel(constants.direccionDistrito());
		distrito.setDisplayField("distrito");
		distrito.setEmptyText("Seleccione...");
		distrito.setStore(Ubigeos.storedistrito);
		distrito.setTypeAhead(true);
		distrito.setTriggerAction(TriggerAction.ALL);
		distrito.setValueField("distrito");
		distrito.setUseQueryCache(false);
		distrito.setMinChars(0);

		distrito.getStore().addStoreListener(new StoreListener<BeanModel>() {
			public void storeDataChanged(StoreEvent<BeanModel> se) {
				distrito.getStore().filter("distrito", distrito.getRawValue());
			}
		});

		distrito.addListener(Events.Expand, new Listener<BaseEvent>() {
			@Override
			public void handleEvent(BaseEvent be) {
				distrito.clearSelections();
			}

		});

		cp.add(distrito, new FormData("-20"));

		ciudad = new TextField<String>();
		ciudad.setMinLength(3);
		ciudad.setFieldLabel(constants.direccionCiudad());
		ciudad.setAllowBlank(false);
		cp.add(ciudad, new FormData("-20"));

		direccion = new TextField<String>();
		direccion.setFieldLabel(constants.clienteDireccion());
		direccion.setAllowBlank(false);
		cp.add(direccion, new FormData("-20"));

		referencias = new TextArea();
		referencias.setHideLabel(true);
		referencias.setEmptyText(constants.direccionReferencias());
		cp.add(referencias, new FormData("-20"));
		
		
		departamento.setEnabled(false);
		provincia.setEnabled(false);
		distrito.setEnabled(false);

	}

	public void beforeEdit() {
		setIconStyle("icon-update");
		setHeading(constants.direccionModificarDireccion());
		status.hide();
		getButtonBar().enable();
		
		
	}

	public void bind(BeanModel selectedModel) {
		formBindings.bind(selectedModel);
	}

	public void unbind() {
		formBindings.unbind();
	}

	public void setListaPais(List<Pais> list) {
		store.add(list);
	}

}